package com.tangfuzhong.aop2;

import org.springframework.aop.framework.ProxyFactory;

/**
 * <p><em>Created on 2021/12/28 5:06 下午</em></p>
 *
 * @author fuzhongtang
 * @since 1.0.1
 */
public class MyAOP {
    public static void main(String[] args) {

        UserDaoImpl userDaoImpl = new UserDaoImpl();

        // 初始化一个代理工厂
        ProxyFactory proxyFactory = new ProxyFactory();
        // 设置目标类，以便于Cglib工具包动态生成目标类的子类，即我们所需的代理类
        proxyFactory.setTarget(userDaoImpl);

        /*
         * 设置拦截器，而拦截器的"public Object invoke(MethodInvocation mi)"定义了
         * 代理类（实际是UserDaoImpl的子类）的方法生成策略。
         */
        proxyFactory.addAdvice(new UserMethodInterceptor());

        // 向上转型，转型为父类类型
        UserDaoImpl proxyUserDaoImpl = (UserDaoImpl) proxyFactory.getProxy();

        /**
         * 调用代理方法
         */
        proxyUserDaoImpl.deleteUser(2);  //应该正常执行，没有什何增强效果
        System.out.println("");// 换行
        proxyUserDaoImpl.addUser("李华");  //入参值会被修改
        System.out.println("");// 换行
        proxyUserDaoImpl.deleteUser(-1);  // 将异常处理效果

    }
}
